#!/usr/bin/env bash
set -euo pipefail

# ==========================================================
# 🇨🇳 NVM Installer for macOS/Linux (China-Optimized v2.2)
# Author: 志辉 <iamzhihuix@gmail.com>
# Repository: https://github.com/iamzhihuix/nvm-install-cn
# ----------------------------------------------------------
# 功能：
#   - 从 Gitee 镜像安装 nvm
#   - 配置国内 Node / npm 镜像源
#   - 安装最新 LTS Node 并设为默认
#   - 自动写入 shell 配置并立即生效
# 说明：兼容 npm v10+（使用环境变量加速二进制下载）
# ==========================================================

info()  { printf "\033[1;34m[INFO]\033[0m %s\n" "$*"; }
ok()    { printf "\033[1;32m[ OK ]\033[0m %s\n" "$*"; }
warn()  { printf "\033[1;33m[WARN]\033[0m %s\n" "$*"; }
err()   { printf "\033[1;31m[ERR ]\033[0m %s\n" "$*" >&2; }

NVM_GIT_URL="https://gitee.com/mirrors/nvm.git"
NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
NVM_NODE_MIRROR="${NVM_NODE_MIRROR:-https://npmmirror.com/mirrors/node/}"
INSTALL_NODE=true
RC_FILE_OVERRIDE=""

# -------- 参数解析 --------
while [[ $# -gt 0 ]]; do
  case "$1" in
    --with-node) INSTALL_NODE=true; shift ;;
    --without-node) INSTALL_NODE=false; shift ;;
    --rc) RC_FILE_OVERRIDE="$2"; shift 2 ;;
    *) warn "未知参数: $1"; shift ;;
  esac
done

# -------- 自动识别 shell 配置文件 --------
detect_rc_file() {
  if [[ -n "${RC_FILE_OVERRIDE}" ]]; then echo "$RC_FILE_OVERRIDE"; return; fi
  local shell_name; shell_name="$(basename "${SHELL:-}")"
  case "$shell_name" in
    zsh) echo "$HOME/.zshrc" ;;
    bash)
      if [[ -f "$HOME/.bashrc" || ! -f "$HOME/.bash_profile" ]]; then
        echo "$HOME/.bashrc"
      else
        echo "$HOME/.bash_profile"
      fi
      ;;
    *) echo "$HOME/.zshrc" ;;
  esac
}
RC_FILE="$(detect_rc_file)"
info "检测到 Shell 配置文件：$RC_FILE"

# -------- 检查 git --------
if ! command -v git >/dev/null 2>&1; then
  err "未检测到 git，请先执行：xcode-select --install"
  exit 1
fi

# -------- 克隆或更新 nvm --------
if [[ -d "$NVM_DIR/.git" ]]; then
  info "检测到 nvm 仓库，执行更新..."
  git -C "$NVM_DIR" fetch --tags --quiet
else
  info "从 Gitee 镜像克隆 nvm..."
  git clone --depth=1 "$NVM_GIT_URL" "$NVM_DIR"
fi

LATEST_TAG="$(git -C "$NVM_DIR" describe --abbrev=0 --tags 2>/dev/null || true)"
if [[ -n "$LATEST_TAG" ]]; then
  git -C "$NVM_DIR" checkout -q "$LATEST_TAG"
  ok "切换到 nvm 最新版本：$LATEST_TAG"
else
  warn "未获取到 tag，保留当前分支。"
fi

# -------- 工具函数 --------
append_line_once() {
  local line="$1" file="$2"
  grep -Fqs "$line" "$file" 2>/dev/null || echo "$line" >> "$file"
}

# -------- 写入配置 --------
info "写入 nvm 环境变量到 $RC_FILE ..."
append_line_once 'export NVM_DIR="$HOME/.nvm"' "$RC_FILE"
append_line_once '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' "$RC_FILE"
append_line_once "export NVM_NODEJS_ORG_MIRROR=\"$NVM_NODE_MIRROR\"" "$RC_FILE"

# npm & 二进制镜像环境变量（兼容 npm v10+）
append_line_once 'export npm_config_registry="https://registry.npmmirror.com"' "$RC_FILE"
append_line_once 'export SASS_BINARY_SITE="https://npmmirror.com/mirrors/node-sass"' "$RC_FILE"
append_line_once 'export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"' "$RC_FILE"
append_line_once 'export PUPPETEER_DOWNLOAD_HOST="https://npmmirror.com/mirrors"' "$RC_FILE"

# -------- 加载配置并验证 --------
info "立即加载配置文件..."
# shellcheck disable=SC1090
source "$RC_FILE" || true
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

if ! command -v nvm >/dev/null 2>&1; then
  err "nvm 未在当前会话生效，请重新打开终端后执行：nvm --version"
  exit 1
fi
ok "nvm 版本：$(nvm --version)"

# -------- 安装 Node --------
if "$INSTALL_NODE"; then
  info "使用国内镜像安装最新 LTS Node ..."
  nvm install --lts
  nvm alias default 'lts/*' || nvm alias default node
  ok "Node：$(node -v) / npm：$(npm -v)"
  npm config set registry https://registry.npmmirror.com
  corepack enable || true
fi

# -------- 完成提示 --------
cat <<EOF

========================================
✅ 安装完成（v2.2）
作者：志辉  <iamzhihuix@gmail.com>
----------------------------------------
验证命令：
  nvm --version
  node -v
  npm -v
  npm config get registry
----------------------------------------
配置已写入：$RC_FILE
========================================
EOF

ok "Done."

# -------- 自动加载环境变量 --------
info "正在重启 shell 以加载新环境变量..."
sleep 1

# 启动新的登录 shell，替换当前进程
exec "$SHELL" -l
